using System;
using System.Collections.Generic;
using System.Text;
using EntidadesTO;
using LogicaNegocio;
using System.Transactions;

namespace Controladoras
{
    public class ProyectoOrdenanzaMunicipalMantenedor
    {
        private static ProyectoOrdenanzaMunicipalMantenedor instancia;
        private List<ProyectoOrdenanzaMunicipalTO> listaProyecto;
        private ProyectoOrdenanzaMunicipalBL proyectoBL;

        public static ProyectoOrdenanzaMunicipalMantenedor ObtenerInstancia()
        {
            if (instancia == null)
            {
                instancia = new ProyectoOrdenanzaMunicipalMantenedor();
            }
            return instancia;
        }

        //Constructor de la clase
        private ProyectoOrdenanzaMunicipalMantenedor()
        {
            listaProyecto = new List<ProyectoOrdenanzaMunicipalTO>();
            proyectoBL = new ProyectoOrdenanzaMunicipalBL();
        }

        public void CargarListaConFiltro(int pNumProyecto, DateTime pFechaIni, DateTime pFechaFin, int pEstado)
        {
            listaProyecto = proyectoBL.ListarPorFiltro(pNumProyecto, pFechaIni,pFechaFin, pEstado);
        }

        //Devolver la lista de documentos legales
        public List<ProyectoOrdenanzaMunicipalTO> ListaProyecto
        {
            get
            {
                return this.listaProyecto;
            }
        }

        public int GuardarProyectoOrdenanzaMunicipal(ProyectoOrdenanzaMunicipalTO pProyecto, DateTime pFecha, int pCodUsuario, bool pPasaAprobacion)
        {
            int nuevoProyecto;
            try
            {
                using (TransactionScope contexto = new TransactionScope())
                {
                    nuevoProyecto = this.proyectoBL.GuardarNuevo(pProyecto);

                    HistoriaModificacionesPOMTO historiaTO = new HistoriaModificacionesPOMTO();
                    historiaTO.NumProyOrdMunicipal = nuevoProyecto; //valor devuelto por la insercion
                    historiaTO.Fecha = pFecha;
                    historiaTO.Accion = 1; //elaboracion
                    historiaTO.Observaciones = "";
                    historiaTO.CodUsuario = pCodUsuario;

                    HistoriaModificacionesPOMBL historiaBL = new HistoriaModificacionesPOMBL();
                    historiaBL.GuardarNuevo(historiaTO);

                    if (pPasaAprobacion)
                    {
                        //se procede a crear el registro de historia asociada al envio para aprobaciones
                        historiaTO = new HistoriaModificacionesPOMTO();
                        historiaTO.NumProyOrdMunicipal = nuevoProyecto;
                        historiaTO.Accion = 6; //Significa que el usuario pasa el proyecto al flujo de aprobaciones
                        historiaTO.Fecha = pFecha;
                        historiaTO.Observaciones = "";
                        historiaTO.CodUsuario = pCodUsuario;

                        historiaBL = new HistoriaModificacionesPOMBL();
                        historiaBL.GuardarNuevo(historiaTO);
                    }

                    contexto.Complete();
                }

            }
            catch (Exception ex)
            {
                nuevoProyecto = -1;
                throw ex;
            }
            return nuevoProyecto;
        }

        public void ModificarProyectoOrdenanzaMunicipal(ProyectoOrdenanzaMunicipalTO pProyecto, DateTime pFecha, int pCodUsuario, bool pPasaAprobacion)
        {
            try
            {
                using (TransactionScope contexto = new TransactionScope())
                {
                    this.proyectoBL.Modificar(pProyecto, pCodUsuario);

                    HistoriaModificacionesPOMTO historiaTO = new HistoriaModificacionesPOMTO();
                    historiaTO.NumProyOrdMunicipal = pProyecto.NumProyOrdMunicipal; //valor devuelto por la insercion
                    historiaTO.Fecha = pFecha;
                    historiaTO.Accion = 5; //modificacion
                    historiaTO.Observaciones = "";
                    historiaTO.CodUsuario = pCodUsuario;

                    HistoriaModificacionesPOMBL historiaBL = new HistoriaModificacionesPOMBL();
                    historiaBL.GuardarNuevo(historiaTO);

                    if (pPasaAprobacion)
                    {
                        //se procede a crear el registro de historia asociada al envio para aprobaciones
                        historiaTO = new HistoriaModificacionesPOMTO();
                        historiaTO.NumProyOrdMunicipal = pProyecto.NumProyOrdMunicipal;
                        historiaTO.Accion = 6; //Significa que el usuario pasa el proyecto al flujo de aprobaciones
                        historiaTO.Fecha = pFecha;
                        historiaTO.Observaciones = "";
                        historiaTO.CodUsuario = pCodUsuario;

                        historiaBL = new HistoriaModificacionesPOMBL();
                        historiaBL.GuardarNuevo(historiaTO);
                    }

                    contexto.Complete();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void ActualizarEstadoProyecto(ProyectoOrdenanzaMunicipalTO pProyecto, int pCodUsuario)
        {
            try
            {
                using (TransactionScope contexto = new TransactionScope())
                {
                    this.proyectoBL.Modificar(pProyecto, pCodUsuario);
                    contexto.Complete();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        public void ValidarEstadoParaModificar(ProyectoOrdenanzaMunicipalTO proyectoTO)
        {
            if (proyectoTO.Estado == 2 || proyectoTO.Estado == 3 || proyectoTO.Estado == 4)
                throw new Exception("No puede modificarse un proyecto que se encuentre en el flujo de aprobaciones");
            else if (proyectoTO.Estado == 5)
                throw new Exception("No puede modificarse un proyecto que ya se encuentre aprobado");
            else if (proyectoTO.Estado == 6)
                throw new Exception("No puede modificarse un proyecto que se encuentre eliminado");
        }
    }
}
